/*********************************************
 * 1. 本地转网络的sockaddr接口
 * 2. 获取ip、port的接口
 * 3. 网络转本地的sockaddr接口
 ********************************************/
#pragma once
#include <cstring>
#include <iostream>

#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

class SockAddr
{
public:
    // 客户端的sockaddr
    SockAddr(std::string &ip, uint16_t port)
        : _ip(ip), _port(port), _addrlen(sizeof(_sockaddr_in))
    {
        // 先把_sockaddr清空
        bzero(&_sockaddr_in, sizeof(_sockaddr_in));
        // 填充_sockaddr字段
        // 1. 16位地址类型
        _sockaddr_in.sin_family = AF_INET;
        // 2. 端口号, 主机端口号->网络端口号
        _sockaddr_in.sin_port = htons(_port);
        // 3. ip，点分十进制ip -> 四字节的网络序列
        inet_pton(AF_INET, _ip.c_str(), &_sockaddr_in.sin_addr.s_addr);
    }

    // 服务器的sockaddr
    SockAddr(uint16_t port)
        : _port(port), _addrlen(sizeof(_sockaddr_in))
    {
        // 先把_sockaddr清空
        bzero(&_sockaddr_in, sizeof(_sockaddr_in));
        // 填充_sockaddr字段
        // 1. 16位地址类型
        _sockaddr_in.sin_family = AF_INET;
        // 2. 端口号, 主机端口号->网络端口号
        _sockaddr_in.sin_port = htons(_port);
        // 3. server端ip要bind本地任意ip    
        _sockaddr_in.sin_addr.s_addr = INADDR_ANY;
    }

    ~SockAddr() {}

    sockaddr_in &GetSockaddr() { return _sockaddr_in; }
    std::string &GetIP() { return _ip; }
    uint16_t Getport() { return _port; }
    socklen_t &GetAddrlen() { return _addrlen; }

private:
    std::string _ip;
    uint16_t _port;
    sockaddr_in _sockaddr_in;
    socklen_t _addrlen;
};